#pragma once

class BulletStrategy
{
private:

public:
	BulletStrategy() = default;
	virtual ~BulletStrategy() = default;

	virtual void idea(double & x, double & y, double dtime, double time, double & vx, double & vy) = 0;
};

class LinearBulletStrategy :public BulletStrategy
{
public:
	LinearBulletStrategy() = default;
	~LinearBulletStrategy() = default;

	void idea(double & x, double & y, double dtime, double time, double & vx, double & vy) override;
};

class TrackBulletStrategy :public BulletStrategy
{
private:
	double time = 0;
	static const int lasting = 2;

public:
	TrackBulletStrategy() = default;
	~TrackBulletStrategy() = default;

	void idea(double & x, double & y, double dtime, double time, double & vx, double & vy) override;
};


class EnemyStrategy
{
protected:
public:
	EnemyStrategy() = default;
	virtual ~EnemyStrategy() = default;

	virtual void idea(double & x, double & y, double dtime, double time, double & vx, double & vy, int & dir, int width, int height) = 0;
};

class EnemyStrategyLinear :public EnemyStrategy
{
public:
	EnemyStrategyLinear() = default;
	~EnemyStrategyLinear() = default;

	void idea(double & x, double & y, double dtime, double time, double & vx, double & vy, int & dir, int width, int height) override;
};

class EnemyStrategyStatic :public EnemyStrategy
{
public:
	EnemyStrategyStatic() = default;
	~EnemyStrategyStatic() = default;

	void idea(double & x, double & y, double dtime, double time, double & vx, double & vy, int & dir, int width, int height) override;
};


class GameStrategy
{
public:
	GameStrategy() = default;
	virtual ~GameStrategy() = default;

	virtual bool win() = 0;
	virtual bool lose() = 0;
};

class GameKillAll :public GameStrategy
{
public:
	GameKillAll() = default;
	~GameKillAll() = default;

	bool win() override;
	bool lose() override;
};

class GameEndPoint :public GameStrategy
{
public:
	GameEndPoint() = default;
	~GameEndPoint() = default;

	bool win() override;
	bool lose() override;
};

class GameCollection :public GameStrategy
{
public:
	GameCollection() = default;
	~GameCollection() = default;

	bool win() override;
	bool lose() override;
};